闲扯
$0/1\ Trie$ 的模板题,数组开小了怎么说???
题面
Solution
要求树上路径的问题我们有一个套路的做法。
每一个点 $i$ 到根结点的路径权值的异或和我们计作 $dis_i$
$u$ 到 $v$ 的路径权值的异或和我们可以拆分一下,即 $dis_{u,v}=dis_u\ xor\ dis_v$ 。
这样问题就转化成了找出两个点 $u,v$ ,使得 $dis_u\ xor\ dis_v$ 最大。
进一步转化。
对于异或的问题,我们可以将其转化为二进制,求每一位的异或。
根据贪心的思想,我们从高到低每一位依次来看。
因为要最大,所以用来匹配的那个数在当前位上要尽量选和已知数不同的。
建立一颗 $0/1\ Trie$ 树,并将所有已知的 $dis$ 全部插入。
对于每一次查询,按照之前说的贪心的想法来向下检索。
对于每一个数,我们求出一个最大,最后再取一个 $\max$ 即可。
Code
1 |
|
总结
对于树上路径的问题,可以拆成与 $LCA$ 有关的式子。
对于异或,可以将所有数转化为二进制,然后每一位依次求解。